package com.cskaoyan.javase.array._7callby;

import java.util.Arrays;

/**
 * 方法的传参问题
 * 何为方法的传参问题: 探究方法对传入的实参变量能够做出什么修改/能不能修改的问题
 * 现在方法的传参主要有两种方式:
 * 值传递(call by value): 指的是方法得到不是实参变量本身,而是实参变量的一个拷贝
 *      如果是值传递,方法是不能对实参取值做出修改的!
 *
 * 引用传递(call by reference):指的是方法得到的是实参本身,就是直接获取了实参的内存地址
 *      如果是引用传递,方法是可以对实参取值做出修改的!
 *
 * 那么Java究竟是何种传值方式呢?
 * 我们写方法进行测试
 * java中实参的种类无非就是两种: 1.基本数据类型  2.引用数据类型
 *
 * 通过一个将int变量取值变为2倍的方法,我们发现Java中的方法是不能修改基本数据类型实参变量的取值的
 *      所以Java至少对于基本数据类型实参是值传递的
 * 通过一个将int数组元素取值2倍的方法,我们发现Java中的方法可以修改引用数据类型对象中元素的取值
 *      所以Java对于引用数据类型是引用传递的
 * 以上结论是很明显错误,这是典型的CSDN低水平博主的复制粘贴之作.实际上Java只存在值传递,没有任何引用传递.
 *
 *
 * 值传递的结论:
 * java中的方法:
 * 不能修改基本数据类型的实参的值，也不能修改引用数据类型实参引用的取值
 * 一个方法不能修改其它方法中局部变量的取值。
 * 一旦违反上述原则，那么局部变量就不"局部"了。
 * 可以改变引用数据类型中对象里的数据（称之为改变对象的状态，改变对象的属性值）
 *
 * @since 16:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*int a = 10;
        // 测试基本数据类型实参传入方法
        doubleIntValue(a);
        System.out.println(a);

        // 测试引用数据类型实参传入方法
        int[] arr = {1, 2, 3};
        System.out.println("二倍之前:" + Arrays.toString(arr));
        doubleElementValue(arr);
        System.out.println("二倍之后:" + Arrays.toString(arr));*/


        int[] arr1 = {1, 2, 3};
        int[] arr2 = {666, 777, 888};
        System.out.println("交换之前arr1"+Arrays.toString(arr1));
        System.out.println("交换之前arr2"+Arrays.toString(arr2));
        /*
            这个交换如果能够成功,说明: java是引用传递
            这个交换如果失败,说明: java是值传递
         */
        swapReference(arr1, arr2);
        System.out.println("交换之后arr1"+Arrays.toString(arr1));
        System.out.println("交换之后arr2"+Arrays.toString(arr2));

    }

    // 需求: 将一个int实参变量取值变成原先的2倍
    public static void doubleIntValue(int a) {
        a *= 2;
    }

    // 需求: 将一个数组中的元素变为原先的2倍
    public static void doubleElementValue(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 2;
        }
    }

    // 需求：交换两个int数组的引用
    public static void swapReference(int[] arr1, int[] arr2) {
        int[] temp = arr1;
        arr1 = arr2;
        arr2 = temp;
        System.out.println("交换的方法中arr1"+Arrays.toString(arr1));
        System.out.println("交换的方法中arr2"+Arrays.toString(arr2));
    }
}
